"""
之前展示的都是 单继承

实际上, 还可以进行多继承

顾名思义, 就是一个子类可以有两个 爸爸
"""
# class Animal():  # 动物
#     def eat(self):
#         print("动物都会吃饭")
#
#
# class WildAnimal():  # 野生动物
#     def hunt(self):
#         print("野生动物会捕猎")
#
#
# class Pet():  # 宠物
#     def play(self):
#         print("和主人一块玩")
#
#
# class 哈士奇(Animal, Pet):
#     def info(self):
#         print("不太聪明的样子")
#
# class Wolf(Animal, WildAnimal):
#     ...
#
# 哈狗 = 哈士奇()
#
# 哈狗.info()
# 哈狗.eat()
# 哈狗.play()


# 多继承引用顺序
# class T():
#
#     def e(self):
#         print(123)
#
# class Y():
#     def e(self):
#         print(234)
#
# class O(T, Y):
#     ...
#
# o = O()
# o.e()

"""
既然类可以多继承, 那么肯定会存在继承查找顺序问题

即相同的属性/方法, 如果多继承, 那么最先引用的是哪一个类

这里就要涉及到两个类别:

经典类
新式类
"""

# 经典类
# python2独有, python3不存在
# 经典类:就是不继承 object 都是经典类
class Grand():  # 经典类
    ...

class Parent(Grand): # 经典类
    ...

class Grand(object):  # 新式类
    ...

class Parent(Grand): # 新式类
    ...

# 新式类
# python3里面,不论是什么类,都是新式类
# 因为python3里面,不论你是否手动的继承了object,他都会帮你隐式继承


# 经典类: 深度优先
# 新式类: 广度优先

# 深度优先:
"""
查找顺序: Child -> Parent1 -> Grand -> Parent2

简单来说, 就是一条路走到黑, 先走的是最近的类, 也就是继承的最左边的类

通过最左边的类, 一直往上找, 找到它的最终父类为为止

如果找到最终的父类都没有找到, 才会从第二个继承的类开始往上找.

现在都是用的python3, 目前基本是看不到深度优先了, 有兴趣的可以单独装个python2来看看
"""

# 广度优先
"""
查找顺序: Child -> Parent1 -> Parent2 -> Grand

简单来说, 就是从左往右找, 先找同级, 如果同级没有, 就再找父类.

定义同级的方式是需要两个类都继承 同一个 父类
"""

# class Grand():
#     ...
#     def info(self):
#         print("Grand")
#
# class Grand1():
#     def info(self):
#         print("Grand1")
#
# class Parent1(Grand1):
#     ...
#     def info(self):
#         print("Parent1")
#
# class Parent2(Grand):
#     # ...
#     def info(self):
#         print("Parent2")
#
#
# class Child(Parent1, Parent2):
#     ...
#
# child = Child()
# child.info()
#
# print(Child.__mro__)